package com.itheima.web.request;
/**
 * request的三方面：
 * 1.继承体系
 * 2.获取请求数据
 * 3.转发请求
 */

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

@WebServlet("/req5")
public class RequestDemo5 extends HttpServlet {

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("demo5.......");
        //存储数据
        req.setAttribute("msg","hello");    //这个方法是存储数据到request域中 相当于Map的键值对


        //请求转发
        req.getRequestDispatcher("/req6").forward(req,resp);

        /**
         * 请求转发的特点：
         * 浏览器地址栏不发生变化
         * 只能转发到当前服务器的内部资源
         * 一次请求，可以在转发的资源间使用request共享数据
         */

    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        this.doGet(req, resp);
    }
}

/**
 * Response：
 * ①设置响应数据功能
 *     响应数据分为三个部分：
 *     1.响应行：HTTP/1.1 200 OK
 *          void setStatus(int sc);设置响应状态码
 *     2.响应头：Content-Type：text/html
 *          void setHeader(String name,String value);设置响应头键值对
 *     3.响应体：<html><head></head><body></body></html>
 *          PrintWriter();获取字符输出流
 *          ServletOutputSteam getOutputStream();获取字节输出流
 * ②完成重定向
 *   Response重定向：
 *   重定向（Redirect）:一种资源跳转方式 （转发也是一种资源跳转方式，但是两者有很大区别
 *   弹幕说：重定向就是无条件转发，全转发
 *   重定向的特点：
 *      1.浏览器地址栏路径发生变化
 *      2.可以重定向到任意位置的资源（服务器内部、外部均可）
 *      3.两次请求，不能再多个资源使用request共享数据
 *    请求转发（forward）特点：
 *      1.浏览器地址栏路径不发生变化
 *      2.只能转发到当前服务器的内部资源
 *      3.一次请求，可以在转发的资源间使用request共享数据
 *
 *    路径问题：
 *    明确路径谁使用？
 *      浏览器使用：需要加虚拟目录（项目访问路径）
 *      服务端使用：不需要加虚拟目录
 *          练习：
 *          <a href='路径' > 加虚拟目录   （因为点击超链接会发送请求到浏览器，所以是给浏览器使用）
 *          <form action='路径' > 加虚拟目录  （跟超链接同理，会发送请求到浏览器，给浏览器用）
 *          req.getRequestDispatcher("路径") 不加虚拟目录 （因为是服务器内部在做资源跳转）
 *          resp.sendRedirect("路径") 加虚拟目录 （发送两次请求，resp1告诉浏览器他干不了，让他找resp2,并且告诉浏览器resp2的位置，所以需要加虚拟位置）
 * ③响应字符数据
 *     使用:
 *         PrintWriter writer = resp.getWritert();
 *         write.write("aaaa");
 *     注意:
 *          该流不需要关闭，随着响应结束，response对象销毁，由服务器关闭
 *          中文数据编码；原因是通过Response获取的字符输出流默认编码：ISO-8859-1
 *
 * ④响应字节数据
 *      使用:
 *          通过Response对象获取字符输出流
 *          ServletOutputStream outputStream = resp.getOutputStream();
 *          写数据
 *          outputStream.write(字节数据);
 *
 *路径问题
 */